/*
 * @Author: 杰编程 2306248989@qq.com
 * @Date: 2023-07-22 18:18:49
 * @LastEditors: 杰编程 2306248989@qq.com
 * @LastEditTime: 2023-07-22 19:16:02
 * @FilePath: /lesson18/volatile/volatile.c
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include <stdio.h>
#include <stdlib.h>

#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
#include <wait.h>

void handler(int signo)
{
    printf("%d:捕捉到信号：%d\n", getpid(), signo);
    while (1)
    {
        pid_t id = waitpid(-1, NULL, 0);
        if (id > 0)
        {
            printf("wait child id:%d\n", id);
        }
        else
            break;
    }
}

int main()
{
    signal(SIGCHLD, handler);
    for (int i = 0; i < 5; i++)
    {
        pid_t id = fork();
        if (id == 0)
        {
            int cnt = 5;
            while (cnt--)
            {
                printf("我是子进程，我的pid：%d，ppid：%d\n", getpid(), getppid());
                sleep(1);
            }
            printf("子进程正常退出！\n");
            exit(0);
        }
    }

    while (1)
        ;
    printf("父进程正常退出！\n");
    return 0;
}

///////////////////////////
// volatile int flag=0;

// void handler(int signo)
// {
//     printf("捕捉到信号：%d ;",signo);
//     printf("flag:0->1\n",flag);
//     flag=1;
// }

// int main()
// {
//     signal(2,handler);

//     while(!flag);
//     printf("process noaml exti\n");
//     return 0;
// }